unit UBaseModel;

interface

uses Classes;

type
  IObservavel = interface;

  IObservador = interface
    ['{41A60C1F-B29B-4D0B-BE2C-C4C8C595ADC6}']

    procedure Atualizar(Observavel: IObservavel);
  end;

  IObservavel = interface
    ['{C0AB4A80-6753-485D-BCCF-203879B7EB97}']

    procedure Anexar(Observador: IObservador);
    procedure Desanexar(Observador: IObservador);
    procedure Notificar;
  end;

  TBaseObjeto = class;

  IControle = interface
    ['{19BF8DE5-F8BF-4387-984F-9C82820C7311}']

    procedure Salvar;

    function Encontrar(sID: String): TBaseObjeto;
    function Novo: TBaseObjeto;
  end;

  TBaseObjeto = class(TInterfacedObject, IObservavel)
    private
      FObservadores: TInterfaceList;
      FsID: String;

      function GetID: String;
      procedure SetID(const Valor: String);

    protected

    public
      constructor Create;
      destructor Destroy; override;

      procedure Anexar(Observador: IObservador);
      procedure Desanexar(Observador: IObservador);
      procedure Notificar;

    published
      property ID: String read GetID write SetID;
  end;


implementation

uses ComObj, SysUtils;

{ TBaseObjeto }

procedure TBaseObjeto.Anexar(Observador: IObservador);
begin
  FObservadores.Add(Observador);
end;

constructor TBaseObjeto.Create;
  var
    GID: TGUID;
begin
  FObservadores := TInterfaceList.Create;

  if CreateGUID(GID) = S_OK then
    FsID := GUIDToString(GID);
end;

procedure TBaseObjeto.Desanexar(Observador: IObservador);
begin
  FObservadores.Remove(Observador);
end;

destructor TBaseObjeto.Destroy;
begin
  FreeAndNil(FObservadores);
  inherited;
end;

function TBaseObjeto.GetID: String;
begin
  Result := FsID;
end;

procedure TBaseObjeto.Notificar;
  var
    ix: Integer;
begin
  for ix := 0 to FObservadores.Count - 1 do
    IObservador(FObservadores[ix]).Atualizar(Self);
end;

procedure TBaseObjeto.SetID(const Valor: String);
begin
  FsID := Valor;
end;

end.
 